from abc import ABC, abstractmethod  # 导入抽象基类模块

# 定义抽象类 Account
class Account(ABC):
    @abstractmethod  # 定义抽象方法 deposit
    def deposit(self, amount):
        pass  # 抽象方法没有具体实现

    @abstractmethod  # 定义抽象方法 withdraw
    def withdraw(self, amount):
        pass  # 抽象方法没有具体实现


# 定义 CheckingAccount 类，继承自 Account
class CheckingAccount(Account):
    def __init__(self, balance=0):  # 初始化方法，设置初始余额
        self.balance = balance

    def deposit(self, amount):  # 实现存款方法
        self.balance += amount  # 增加余额

    def withdraw(self, amount):  # 实现取款方法
        if amount + 2 <= self.balance:  # 检查余额是否足够（包括手续费 2）
            self.balance -= amount + 2  # 扣除取款金额和手续费
        else:
            print("Insufficient funds")  # 提示余额不足


# 定义 SavingsAccount 类，继承自 Account
class SavingsAccount(Account):
    def __init__(self, balance=0):  # 初始化方法，设置初始余额
        self.balance = balance

    def deposit(self, amount):  # 实现存款方法
        self.balance += amount * 1.01  # 增加余额并计算利息（1%）

    def withdraw(self, amount):  # 实现取款方法
        if amount <= self.balance:  # 检查余额是否足够
            self.balance -= amount  # 扣除取款金额
        else:
            print("Insufficient funds")  # 提示余额不足


# 测试代码
checking = CheckingAccount(100)  # 创建一个初始余额为 100 的 CheckingAccount 对象
savings = SavingsAccount(100)  # 创建一个初始余额为 100 的 SavingsAccount 对象

checking.deposit(50)  # 向 CheckingAccount 存入 50
checking.withdraw(20)  # 从 CheckingAccount 取出 20
print(f"Checking Account Balance: {checking.balance}")  # 打印 CheckingAccount 的余额

savings.deposit(50)  # 向 SavingsAccount 存入 50
savings.withdraw(20)  # 从 SavingsAccount 取出 20
print(f"Savings Account Balance: {savings.balance}")  # 打印 SavingsAccount 的余额
